/*
 * Copyright 2010-2012 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.jslet.paas.modelmeta.model;

import java.util.ArrayList;
import java.util.List;


public final class ModelMetaConfiguration
{
	public final static ModelMetaConfiguration SINGLETON = new ModelMetaConfiguration();

	List<ModelMeta> allBoConfig = new ArrayList<ModelMeta>();

	private ModelMetaConfiguration()
	{
		this.initializeTestData();
	}
	
//	private BizModel metaDataModel;

	public List<ModelMeta> getAllBoConfig()
	{
		return this.allBoConfig;
	}

	public ModelMeta getBoConfig(String boName)
	{
		for (ModelMeta bo : this.allBoConfig)
		{
			if (bo.getName().equalsIgnoreCase(boName)){
				return bo;
			}
		}
		return null;
	}

	private void initializeTestData()
	{
		this.addMetaDataConfig();
		
		//for test
		this.addVersionConfig();
		this.addModuleConfig();
	}

	private void addMetaDataConfig(){
		//create ModelMeta configuration
		ModelMeta bo = new ModelMeta();
		bo.setModelId(-100);
		bo.setName("ModelMeta");
		bo.setDescription("ModelMeta structure");
		bo.setDbObject("TMetaData");
		bo.setKeyField("modelId");
		bo.setPackageName("org.jslet.entity");
		
		List<FieldMeta> bizFields = new ArrayList<FieldMeta>();
		FieldMeta fo = new FieldMeta();
		fo.setFieldId(-100);
		fo.setName("modelId");
		fo.setLabel("Model Id");
		fo.setType(FieldMetaType.NUMBER);
		fo.setDbColumn("modelId");
		fo.setDefaultValue(1);
		fo.setModelMeta(bo);
		bizFields.add(fo);

		fo = new FieldMeta();
		fo.setFieldId(-102);
		fo.setName("name");
		fo.setLabel("Name");
		fo.setType(FieldMetaType.STRING);
		fo.setDbColumn("name");
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		fo = new FieldMeta();
		fo.setFieldId(-102);
		fo.setName("description");
		fo.setLabel("Description");
		fo.setType(FieldMetaType.STRING);
		fo.setDbColumn("description");
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		fo = new FieldMeta();
		fo.setFieldId(-103);
		fo.setName("keyField");
		fo.setLabel("keyField");
		fo.setType(FieldMetaType.STRING);
		fo.setDbColumn("keyField");
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		fo = new FieldMeta();
		fo.setFieldId(-104);
		fo.setName("inputValueField");
		fo.setLabel("inputValueField");
		fo.setType(FieldMetaType.STRING);
		fo.setDbColumn("inputValueField");
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		fo = new FieldMeta();
		fo.setFieldId(-105);
		fo.setName("displayValueField");
		fo.setLabel("displayValueField");
		fo.setType(FieldMetaType.STRING);
		fo.setDbColumn("displayValueField");
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		fo = new FieldMeta();
		fo.setFieldId(-106);
		fo.setName("parentField");
		fo.setLabel("parentField");
		fo.setType(FieldMetaType.STRING);
		fo.setDbColumn("parentField");
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		fo = new FieldMeta();
		fo.setFieldId(-107);
		fo.setName("levelField");
		fo.setLabel("levelField");
		fo.setType(FieldMetaType.STRING);
		fo.setDbColumn("levelField");
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		fo = new FieldMeta();
		fo.setFieldId(-108);
		fo.setName("fields");
		fo.setLabel("fields");
		fo.setType(FieldMetaType.SUBDATASET);
		fo.setSubDataset("metaField");
		fo.setSubDatasetFk("modelId");
		fo.setVisible(false);
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		bo.setFields(bizFields);
		this.allBoConfig.add(bo);
		
		//create MetaField configuration
		bo = new ModelMeta();
		bo.setModelId(-102);
		bo.setName("MetaField");
		bo.setDescription("MetaField structure");
		bo.setDbObject("TMetaField");
		bo.setKeyField("fieldId");
		bo.setPackageName("org.jslet.entity");
		bizFields = new ArrayList<FieldMeta>();

		fo = new FieldMeta();
		fo.setFieldId(-120);
		fo.setName("modelId");
		fo.setLabel("modelId");
		fo.setDbColumn("modelId");
		fo.setVisible(false);
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
//		fo = new BizField();
//		fo.setFieldId(-120);
//		fo.setName("modelId");
//		fo.setLabel("modelId");
//		fo.setType(MetaFieldType.SUBDATASET);
//		fo.setSubDataset("ModelMeta");
//		fo.setSubDatasetFk("modelId");
//		fo.setOneToOne(true);
//		fo.setVisible(false);
//		fo.setBizModel(bo);
//		bizFields.add(fo);
		
		fo = new FieldMeta();
		fo.setFieldId(-121);
		fo.setName("fieldId");
		fo.setLabel("Field Id");
		fo.setType(FieldMetaType.NUMBER);
		fo.setDbColumn("fieldId");
		fo.setDefaultValue(1);
		fo.setModelMeta(bo);
		bizFields.add(fo);

		fo = new FieldMeta();
		fo.setFieldId(-122);
		fo.setName("index");
		fo.setLabel("Index");
		fo.setType(FieldMetaType.NUMBER);
		fo.setDbColumn("index");
		fo.setModelMeta(bo);
		bizFields.add(fo);

		fo = new FieldMeta();
		fo.setFieldId(-123);
		fo.setName("name");
		fo.setLabel("Name");
		fo.setType(FieldMetaType.STRING);
		fo.setDbColumn("name");
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		fo = new FieldMeta();
		fo.setFieldId(-124);
		fo.setName("label");
		fo.setLabel("Label");
		fo.setType(FieldMetaType.STRING);
		fo.setDbColumn("label");
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		fo = new FieldMeta();
		fo.setFieldId(-125);
		fo.setName("groupLabel");
		fo.setLabel("groupLabel");
		fo.setType(FieldMetaType.STRING);
		fo.setDbColumn("groupLabel");
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		fo = new FieldMeta();
		fo.setFieldId(-126);
		fo.setName("type");
		fo.setLabel("type");
		fo.setType(FieldMetaType.STRING);
		fo.setDbColumn("type");
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		fo = new FieldMeta();
		fo.setFieldId(-127);
		fo.setName("subDataset");
		fo.setLabel("subDataset");
		fo.setType(FieldMetaType.STRING);
		fo.setDbColumn("subDataset");
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		fo = new FieldMeta();
		fo.setFieldId(-128);
		fo.setName("length");
		fo.setLabel("length");
		fo.setType(FieldMetaType.NUMBER);
		fo.setDbColumn("length");
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		fo = new FieldMeta();
		fo.setFieldId(-129);
		fo.setName("scale");
		fo.setLabel("scale");
		fo.setType(FieldMetaType.NUMBER);
		fo.setDbColumn("scale");
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		fo = new FieldMeta();
		fo.setFieldId(-130);
		fo.setName("defaultExpr");
		fo.setLabel("defaultExpr");
		fo.setType(FieldMetaType.STRING);
		fo.setDbColumn("defaultExpr");
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		fo = new FieldMeta();
		fo.setFieldId(-131);
		fo.setName("defaultValue");
		fo.setLabel("defaultValue");
		fo.setType(FieldMetaType.STRING);
		fo.setDbColumn("defaultValue");
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		fo = new FieldMeta();
		fo.setFieldId(-132);
		fo.setName("displayWidth");
		fo.setLabel("displayWidth");
		fo.setType(FieldMetaType.NUMBER);
		fo.setDbColumn("displayWidth");
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		fo = new FieldMeta();
		fo.setFieldId(-133);
		fo.setName("alignment");
		fo.setLabel("alignment");
		fo.setType(FieldMetaType.STRING);
		fo.setDbColumn("alignment");
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		fo = new FieldMeta();
		fo.setFieldId(-134);
		fo.setName("displayFormat");
		fo.setLabel("displayFormat");
		fo.setType(FieldMetaType.STRING);
		fo.setDbColumn("displayFormat");
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		fo = new FieldMeta();
		fo.setFieldId(-135);
		fo.setName("editControl");
		fo.setLabel("editControl");
		fo.setType(FieldMetaType.STRING);
		fo.setDbColumn("editControl");
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		fo = new FieldMeta();
		fo.setFieldId(-136);
		fo.setName("formula");
		fo.setLabel("formula");
		fo.setType(FieldMetaType.STRING);
		fo.setDbColumn("formula");
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		fo = new FieldMeta();
		fo.setFieldId(-137);
		fo.setName("readOnly");
		fo.setLabel("readOnly");
		fo.setType(FieldMetaType.BOOLEAN);
		fo.setDbColumn("readOnly");
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		fo = new FieldMeta();
		fo.setFieldId(-138);
		fo.setName("visible");
		fo.setLabel("visible");
		fo.setType(FieldMetaType.BOOLEAN);
		fo.setDbColumn("visible");
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		fo = new FieldMeta();
		fo.setFieldId(-139);
		fo.setName("exchged");
		fo.setLabel("exchged");
		fo.setType(FieldMetaType.BOOLEAN);
		fo.setDbColumn("exchged");
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		fo = new FieldMeta();
		fo.setFieldId(-140);
		fo.setName("required");
		fo.setLabel("required");
		fo.setType(FieldMetaType.BOOLEAN);
		fo.setDbColumn("required");
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		fo = new FieldMeta();
		fo.setFieldId(-141);
		fo.setName("range");
		fo.setLabel("range");
		fo.setType(FieldMetaType.STRING);
		fo.setDbColumn("range");
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		fo = new FieldMeta();
		fo.setFieldId(-142);
		fo.setName("regularExpr");
		fo.setLabel("regularExpr");
		fo.setType(FieldMetaType.STRING);
		fo.setDbColumn("regularExpr");
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		fo = new FieldMeta();
		fo.setFieldId(-143);
		fo.setName("lookupField");
		fo.setLabel("lookupField");
		fo.setType(FieldMetaType.STRING);
		fo.setDbColumn("lookupField");
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		fo = new FieldMeta();
		fo.setFieldId(-144);
		fo.setName("urlExpr");
		fo.setLabel("urlExpr");
		fo.setType(FieldMetaType.STRING);
		fo.setDbColumn("urlExpr");
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		fo = new FieldMeta();
		fo.setFieldId(-145);
		fo.setName("urlTarget");
		fo.setLabel("urlTarget");
		fo.setType(FieldMetaType.STRING);
		fo.setDbColumn("urlTarget");
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		fo = new FieldMeta();
		fo.setFieldId(-146);
		fo.setName("betweenStyle");
		fo.setLabel("betweenStyle");
		fo.setType(FieldMetaType.BOOLEAN);
		fo.setDbColumn("betweenStyle");
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		fo = new FieldMeta();
		fo.setFieldId(-147);
		fo.setName("maxValueField");
		fo.setLabel("maxValueField");
		fo.setType(FieldMetaType.STRING);
		fo.setDbColumn("maxValueField");
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		fo = new FieldMeta();
		fo.setFieldId(-148);
		fo.setName("clientTranslate");
		fo.setLabel("clientTranslate");
		fo.setType(FieldMetaType.BOOLEAN);
		fo.setDbColumn("clientTranslate");
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		fo = new FieldMeta();
		fo.setFieldId(-149);
		fo.setName("inputValueField");
		fo.setLabel("inputValueField");
		fo.setType(FieldMetaType.STRING);
		fo.setDbColumn("inputValueField");
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		fo = new FieldMeta();
		fo.setFieldId(-150);
		fo.setName("displayValueField");
		fo.setLabel("displayValueField");
		fo.setType(FieldMetaType.STRING);
		fo.setDbColumn("displayValueField");
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		fo = new FieldMeta();
		fo.setFieldId(-151);
		fo.setName("oneToOne");
		fo.setLabel("oneToOne");
		fo.setType(FieldMetaType.BOOLEAN);
		fo.setDbColumn("oneToOne");
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		fo = new FieldMeta();
		fo.setFieldId(-152);
		fo.setName("subDatasetFk");
		fo.setLabel("subDatasetFk");
		fo.setType(FieldMetaType.STRING);
		fo.setDbColumn("subDatasetFk");
		fo.setModelMeta(bo);
		bizFields.add(fo);
		
		bo.setFields(bizFields);
		this.allBoConfig.add(bo);
	}
	
	//for test
	private void addModuleConfig()
	{
		ModelMeta bo = new ModelMeta();
		bo.setModelId(1);
		bo.setName("AAModule");
		bo.setDescription("Keep all modules in AA system");
		bo.setDbObject("AAVERSION_MODULE");
		bo.setKeyField("MODULE_NAME");
		bo.setPackageName("com.accela.dynamicentity");

		List<FieldMeta> bizFields = new ArrayList<FieldMeta>();
		bo.setFields(bizFields);
		bo.setKeyField("moduleName");

		FieldMeta fldCfg = new FieldMeta();
		fldCfg.setFieldId(0);
		fldCfg.setName("versionNbr");
		fldCfg.setLabel("Version_Number");
		fldCfg.setType(FieldMetaType.NUMBER);
		fldCfg.setDbColumn("AA_VERSION_NBR");
		fldCfg.setModelMeta(bo);
		bizFields.add(fldCfg);
		
		FieldMeta fldObj = new FieldMeta();
		fldObj.setFieldId(1);
		fldObj.setName("moduleName");
		fldObj.setLabel("Module_name");
		fldObj.setType(FieldMetaType.STRING);
		fldObj.setDbColumn("MODULE_NAME");
		fldObj.setModelMeta(bo);
		bizFields.add(fldObj);

		fldObj = new FieldMeta();
		fldObj.setFieldId(2);
		fldObj.setName("moduleAlias");
		fldObj.setLabel("Module_alias");
		fldObj.setType(FieldMetaType.STRING);
		fldObj.setDbColumn("MODULE_ALIAS");
		fldObj.setModelMeta(bo);
		bizFields.add(fldObj);

		fldObj = new FieldMeta();
		fldObj.setFieldId(3);
		fldObj.setName("solutionName");
		fldObj.setLabel("Solution_Name");
		fldObj.setType(FieldMetaType.STRING);
		fldObj.setDbColumn("SOLUTION_NAME");
		fldObj.setModelMeta(bo);
		bizFields.add(fldObj);

		fldObj = new FieldMeta();
		fldObj.setFieldId(4);
		fldObj.setName("recFulNam");
		fldObj.setLabel("Full_Name");
		fldObj.setType(FieldMetaType.STRING);
		fldObj.setDbColumn("REC_FUL_NAM");
		fldObj.setModelMeta(bo);
		bizFields.add(fldObj);

		fldObj = new FieldMeta();
		fldObj.setFieldId(5);
		fldObj.setName("recDate");
		fldObj.setLabel("Record_Date");
		fldObj.setType("D");
		fldObj.setDbColumn("REC_DATE");
		fldObj.setModelMeta(bo);
		bizFields.add(fldObj);

		this.allBoConfig.add(bo);
	}

	//for test
	private void addVersionConfig()
	{
		ModelMeta bo = new ModelMeta();
		bo.setModelId(2);
		bo.setName("AAVersion");
		bo.setDescription("Keep all module's Versions in AA system");
		bo.setDbObject("AAVERSION");
		bo.setKeyField("AA_VERSION_NBR");
		bo.setPackageName("com.accela.dynamicentity");

		List<FieldMeta> bizFields = new ArrayList<FieldMeta>();
		bo.setFields(bizFields);
		bo.setKeyField("versionNbr");

		FieldMeta fldCfg = new FieldMeta();
		fldCfg.setFieldId(1);
		fldCfg.setName("versionNbr");
		fldCfg.setLabel("Version_Number");
		fldCfg.setType(FieldMetaType.NUMBER);
		fldCfg.setDbColumn("AA_VERSION_NBR");
		fldCfg.setModelMeta(bo);
		bizFields.add(fldCfg);

		fldCfg = new FieldMeta();
		fldCfg.setFieldId(2);
		fldCfg.setName("version");
		fldCfg.setLabel("Version");
		fldCfg.setType(FieldMetaType.STRING);
		fldCfg.setDbColumn("AA_VERSION");
		fldCfg.setModelMeta(bo);
		bizFields.add(fldCfg);

		fldCfg = new FieldMeta();
		fldCfg.setFieldId(3);
		fldCfg.setName("isDefault");
		fldCfg.setLabel("Is_Default");
		fldCfg.setType(FieldMetaType.STRING);
		fldCfg.setDbColumn("ISDEFAULT");
		fldCfg.setModelMeta(bo);
		bizFields.add(fldCfg);

		fldCfg = new FieldMeta();
		fldCfg.setFieldId(4);
		fldCfg.setName("releaseInfo");
		fldCfg.setLabel("Full_Name");
		fldCfg.setType(FieldMetaType.STRING);
		fldCfg.setDbColumn("RELEASE_INFO");
		fldCfg.setModelMeta(bo);
		bizFields.add(fldCfg);

		fldCfg = new FieldMeta();
		fldCfg.setFieldId(5);
		fldCfg.setName("prodDate");
		fldCfg.setLabel("Record_Date");
		fldCfg.setType("D");
		fldCfg.setDbColumn("PROD_DATE");
		fldCfg.setModelMeta(bo);
		bizFields.add(fldCfg);

		fldCfg = new FieldMeta();
		fldCfg.setFieldId(6);
		fldCfg.setName("modules");
		fldCfg.setLabel("modules");
		fldCfg.setType("A");
		fldCfg.setSubDataset("AAModule");
		fldCfg.setSubDatasetFk("AA_VERSION_NBR");
		fldCfg.setModelMeta(bo);
		bizFields.add(fldCfg);

		this.allBoConfig.add(bo);
	}

}
